package org.wheel.module.core.util;

import cn.hutool.core.collection.ListUtil;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Objects;

/**
 * 集合切分工具
 * 基于 Hutool、JDK17
 */
public final class SplitUtil {

    /**
     * 按指定数量切分集合
     *
     * @param source 源集合
     * @param limit  每段最大数量（必须 > 0）
     * @param <T>    元素类型
     * @return 不可修改的列表（段列表）
     */
    public static <T> List<List<T>> split(List<T> source, int limit) {
        if (Objects.isNull(source) || source.isEmpty()) {
            return Collections.emptyList();
        }
        if (limit <= 0) {
            throw new IllegalArgumentException("limit must be > 0");
        }
        if(source.size() <= limit){
            return Collections.singletonList(source);
        }
        // Hutool 现成方法
        return ListUtil.split(source, limit);
    }

    /**
     * 示例：JDK17 写法（无 Hutool 也可直接复制）
     */
    public static <T> List<List<T>> splitJdk17(List<T> source, int limit) {
        if (source == null || source.isEmpty() || limit <= 0) {
            return Collections.emptyList();
        }
        if (source.size() <= limit) {
            return Collections.singletonList(Collections.unmodifiableList(source));
        }
        List<List<T>> result = new ArrayList<>((source.size() + limit - 1) / limit);
        for (int i = 0; i < source.size(); i += limit) {
            result.add(Collections.unmodifiableList(source.subList(i, Math.min(i + limit, source.size()))));
        }
        return Collections.unmodifiableList(result);
    }

    private SplitUtil() {
    }
}